home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / unix / rcs.13 < prev    next >
Internet Message Format  |  1989-11-19  |  62KB

  1. Path: xanth!samsung!gem.mps.ohio-state.edu!apple!sun-barr!newstop!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i228:  rcs - revision control system, Part13/14
  5. Message-ID: <128104@sun.Eng.Sun.COM>
  6. Date: 19 Nov 89 09:26:11 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2160
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: rsbx@cbmvax.commodore.com (Raymond S. Brand)
  12. Posting-number: Volume 89, Issue 228
  13. Archive-name: unix/rcs.13
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    rcs/rcs.rcsfiles/merge.c,v
  24. #    rcs/rcs.rcsfiles/makefile,v
  25. #    rcs/rcs.rcsfiles/co.c,v
  26. #    rcs/rcs.rcsfiles/curdir.c,v
  27. # This is archive 13 of a 14-part kit.
  28. # This archive created: Sun Nov 19 01:12:13 1989
  29. if `test ! -d rcs`
  30. then
  31.   mkdir rcs
  32.   echo "mkdir rcs"
  33. fi
  34. if `test ! -d rcs/rcs.rcsfiles`
  35. then
  36.   mkdir rcs/rcs.rcsfiles
  37.   echo "mkdir rcs/rcs.rcsfiles"
  38. fi
  39. echo "extracting rcs/rcs.rcsfiles/merge.c,v"
  40. sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/merge.c,v
  41. Xhead     1.2;
  42. Xbranch   1;
  43. Xaccess   ;
  44. Xsymbols  amiga_rcs:1;
  45. Xlocks    ; strict;
  46. Xcomment  @ * @;
  47. X
  48. X
  49. X1.2
  50. Xdate     89.11.10.15.24.53;  author rsbx;  state Exp;
  51. Xbranches ;
  52. Xnext     1.1;
  53. X
  54. X1.1
  55. Xdate     89.11.03.20.47.54;  author rsbx;  state Exp;
  56. Xbranches ;
  57. Xnext     ;
  58. X
  59. X
  60. Xdesc
  61. X@C implementation of  the "merge.sh" script in the 4.? RCS source
  62. Xdistribution.
  63. X@
  64. X
  65. X
  66. X1.2
  67. Xlog
  68. X@Sync'd BUFFSIZE with size of fread().
  69. X@
  70. Xtext
  71. X@/*
  72. X * merge.c
  73. X *
  74. X * Rick Schaeffer (ricks@@iscuva.iscs.com)
  75. X * Raymond S. Brand (rsbx@@cbmvax.commodore.com)
  76. X *
  77. X * This is a 'c' implementation of the 'merge.sh' scriptin the
  78. X * 4.? RCS source distribution
  79. X *
  80. X */
  81. X
  82. X#ifndef lint
  83. X static char rcsid[]=
  84. X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/merge.c,v 1.1 89/11/03 20:47:54 rsbx Exp Locker: rsbx $";
  85. X#endif
  86. X/*
  87. X * $Log:    merge.c,v $
  88. X * Revision 1.1  89/11/03  20:47:54  rsbx
  89. X * Initial revision
  90. X * 
  91. X */
  92. X
  93. X#include <stdio.h>
  94. X
  95. Xextern FILE *popenl(char *, ... );
  96. X
  97. X#define BUFFSIZE 256
  98. X
  99. Xstatic char buff[BUFFSIZE];
  100. X
  101. Xvoid main(int argc, char **argv)
  102. X    {
  103. X    FILE *fptr, *pipefp;
  104. X    char *pswitch;
  105. X    int overlaps, count;
  106. X    char *cmd = *argv;
  107. X
  108. X    if (argc < 3)
  109. X        {
  110. X        printf("Usage: %s [-p] file1 file2 file3\n", cmd);
  111. X        exit(1);
  112. X        }
  113. X
  114. X    if (!strcmp(argv[1], "-p"))
  115. X        {
  116. X        pswitch = "1,$p\n";
  117. X        argv++;
  118. X        }
  119. X    else
  120. X        {
  121. X        pswitch = "w\n";
  122. X        }
  123. X
  124. X    if (!(fptr = popenl(DIFF3, "-E", argv[1], argv[2], argv[3], NULL, "r")))
  125. X        {
  126. X        fprintf(stderr, "%s: unable to open %s pipe\n", cmd, DIFF3);
  127. X        exit(1);
  128. X        }
  129. X
  130. X    if (!(pipefp = popenl(ED, "-", argv[1], NULL, "w")))
  131. X        {
  132. X        pclose(fptr);
  133. X        fprintf(stderr, "%s: unable to open %s pipe\n", cmd, ED);
  134. X        exit(1);
  135. X        }
  136. X
  137. X    while (count = fread(buff, 1, BUFFSIZE, fptr))
  138. X        {
  139. X        fwrite(buff, 1, count, pipefp);
  140. X        }
  141. X
  142. X    fputs(pswitch, pipefp);
  143. X    pclose(pipefp);
  144. X
  145. X    if (overlaps = pclose(fptr))
  146. X        {
  147. X        pswitch = "";
  148. X        if (overlaps != 1)
  149. X            {
  150. X            pswitch = "s";
  151. X            }
  152. X        fprintf(stderr, "Warning: %d overlap%s during merge\n", overlaps, pswitch);
  153. X        }
  154. X    }
  155. X@
  156. X
  157. X
  158. X1.1
  159. Xlog
  160. X@Initial revision
  161. X@
  162. Xtext
  163. X@d14 1
  164. Xa14 1
  165. X "$Header$";
  166. Xd17 4
  167. Xa20 1
  168. X * $Log$
  169. Xa26 3
  170. X#ifdef DEBUG
  171. X#define BUFFSIZE 32
  172. X#else
  173. Xa27 1
  174. X#endif
  175. Xd67 1
  176. Xa67 1
  177. X    while (count = fread(buff, 1, 256, fptr))
  178. X@
  179. SHAR_EOF
  180. echo "extracting rcs/rcs.rcsfiles/makefile,v"
  181. sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/makefile,v
  182. Xhead     1.13;
  183. Xbranch   1.13.2;
  184. Xaccess   ;
  185. Xsymbols  amiga_rcs:1.13.2 cbmvax_source:1.13.1 uunet_june89_dist:1.13;
  186. Xlocks    rsbx:1.13.2.4; strict;
  187. Xcomment  @# @;
  188. X
  189. X
  190. X1.13
  191. Xdate     89.05.02.14.53.40;  author narten;  state Exp;
  192. Xbranches 1.13.1.1 1.13.2.1;
  193. Xnext     ;
  194. X
  195. X1.13.1.1
  196. Xdate     89.08.11.01.41.03;  author rsbx;  state Exp;
  197. Xbranches ;
  198. Xnext     1.13.1.2;
  199. X
  200. X1.13.1.2
  201. Xdate     89.08.11.02.15.34;  author rsbx;  state Exp;
  202. Xbranches ;
  203. Xnext     ;
  204. X
  205. X1.13.2.1
  206. Xdate     89.10.13.19.16.09;  author rsbx;  state Exp;
  207. Xbranches ;
  208. Xnext     1.13.2.2;
  209. X
  210. X1.13.2.2
  211. Xdate     89.10.15.15.38.02;  author rsbx;  state Exp;
  212. Xbranches ;
  213. Xnext     1.13.2.3;
  214. X
  215. X1.13.2.3
  216. Xdate     89.11.03.20.53.51;  author rsbx;  state Exp;
  217. Xbranches ;
  218. Xnext     1.13.2.4;
  219. X
  220. X1.13.2.4
  221. Xdate     89.11.05.18.05.11;  author rsbx;  state Exp;
  222. Xbranches ;
  223. Xnext     ;
  224. X
  225. X
  226. Xdesc
  227. X@Makefile for RCS distribution.
  228. X@
  229. X
  230. X
  231. X1.13
  232. Xlog
  233. X@checked in with -k by rsbx at 89.08.10.16.00.19.
  234. X@
  235. Xtext
  236. X@#$Header: /usr/src/local/bin/rcs/src/RCS/Makefile,v 1.13 89/05/02 14:53:40 narten Exp $
  237. X# Copyright (C) 1982, 1988, 1989 Walter Tichy
  238. X# All rights reserved.
  239. X#
  240. X# Redistribution and use in source and binary forms are permitted
  241. X# provided that the above copyright notice and this paragraph are
  242. X# duplicated in all such forms and that any documentation,
  243. X# advertising materials, and other materials related to such
  244. X# distribution and use acknowledge that the software was developed
  245. X# by Walter Tichy.
  246. X# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  247. X# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  248. X# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  249. X#
  250. X# Report all problems and direct all questions to:
  251. X#   rcs-bugs@@cs.purdue.edu
  252. X# 
  253. X#
  254. X#
  255. X#
  256. X#
  257. X#
  258. X#
  259. X#
  260. X#               INSTRUCTIONS
  261. X#               ============
  262. X# 0.  If you are porting to different hardware,
  263. X#     check the instructions in rcsbase.h
  264. X#
  265. X# Note: instructions 1-5 are normally taken care of by the calling make,
  266. X# which passes in DIFF, DIFF3, RCSDIR, OLDDIR, OS, and LOCKING.
  267. X#
  268. X# 1. Early version of diff did not support options needed by RCS.
  269. X#    Newer versions of diff, support them and diff is no longer distributed with
  270. X#    RCS. The following definitions apply only if you have both old versions
  271. X#    and new versions of diff, and you want RCS to use the new versions.
  272. X#    The default should be :
  273. X#
  274. X
  275. XDIFF      = /bin/diff
  276. XDIFF3     = /usr/lib/diff3
  277. X
  278. X# 2.  Figure out where to put the RCS commands; define RCSDIR accordingly.
  279. X
  280. XRCSDIR  = /usr/local/bin
  281. X
  282. X
  283. X# 3.  Figure out where to put your old RCS commands; define OLDDIR
  284. X#     accordingly. This is not needed if you don't have an old release of RCS.
  285. XOLDDIR    = /usr/old/bin
  286. X
  287. X# 4.  Set the operating system variable OS. If you run on 4.1 BSD, do not
  288. X#     define OS:
  289. X#     OS  =
  290. X#     If you run on USG Unix or UN*X, use:
  291. X#     OS  = -DUSG
  292. X#     If you run on Version 6 Unix, use:
  293. X#     OS  = -DV6
  294. X#     If you run on 4.2 or 4.3 BSD, use:
  295. X#     OS = -DV4_2BSD
  296. XOS        = -DV4_2BSD
  297. X
  298. X#     Also, set SIGNAL_TYPE to be what your signal() handlers yield.
  299. X#     Old-fashioned signal handlers yield 'int'; the newer ones 'void'.
  300. X
  301. XSIGNAL_TYPE = int
  302. X
  303. X# 5.  Decide whether you want strict locking as the default or not.
  304. X#     If you want strict locking, use:
  305. X#     LOCKING = 1
  306. X#     otherwise:
  307. X#     LOCKING = 0
  308. XLOCKING   = 1
  309. X
  310. X# 6.  Decide what loader flags you need, and define LDFLAGS accordingly.
  311. X#     On the Vax you need none, on PDP-11s with split i/d you need -i.
  312. X#LDFLAGS  = -i
  313. XLDFLAGS   =
  314. X
  315. X# 7.  RCS can maintain a log of the use of the co and ci commands. If you
  316. X#     want the logging, you must
  317. X#     a) define SNOOP (that's where the process that writes the log goes),
  318. X#     b) define SNOOPFILE (that's the file where SNOOP writes the log;
  319. X#        it must be owned by the same user that owns SNOOP),
  320. X#     c) include SNOOP and SNOOPFILE in the CFLAGS macro.
  321. X#     If you don't want the logging of command usage, omit the SNOOP and
  322. X#     SNOOPFILE definitions from CFLAGS.
  323. X#     The two variants of the CFLAG macros are given below.
  324. XSNOOPFILE = /usr/log/rcslog/log
  325. XSNOOP    = /usr/local/bin/snoop
  326. X
  327. XDEFINES= -DCOMPAT2 $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' 
  328. XCFLAGS    = -O $(DEFINES)
  329. XLINTFLAGS = -c -u
  330. XLINT = lint $(LINTFLAGS) -Dlint $(DEFINES)
  331. X
  332. X# 8.  If you don't have release 2 RCS files around (e.g., if you don't
  333. X#     have release 2 of RCS), remove the word -DCOMPAT2 from whatever
  334. X#     variant of CFLAGS you selected. -DCOMPAT2 assures that release 2
  335. X#     RCS files can still be read. (After all release 2 RCS files have
  336. X#     been updated with release 3 or 4 ci or rcs, you can remake RCS without
  337. X#     -DCOMPAT2.) Also, make sure that the co commands at the end of this
  338. X#     file are commented out; otherwise, Make will complain.
  339. X#
  340. X# 9.  Now you are ready. Try to make 'depend' and 'all'. If all went well, make
  341. X#     'install' if you want no logging of command usage, 'installog' otherwise.
  342. X#
  343. X# 10. IMPORTANT! When you have RCS installed, rename old
  344. X#     release 2 RCS files as follows (if you have any):
  345. X#     If the working file was "f.c" and the RCS file "f.c.v", rename the
  346. X#     RCS file to "f.c,v". If the working file was "f.c" and the RCS file
  347. X#     "f.v", rename the RCS file "f.c,v". Thus, suffixes are no longer
  348. X#     dropped and RCS files end in ",v" rather than ".v".
  349. X#
  350. X# 11. If you want to maintain RCS with itself, be sure you preserve the
  351. X#     original revision numbers, dates, etc. This is done by checking the
  352. X#     files in with the -k option. When done, remove the comments from the
  353. X#     co-rules at the end of this file.
  354. X#
  355. XBCOMMANDS   =   ci ident rcs rcsdiff rcsmerge rlog co
  356. X# binary comands
  357. X
  358. XRCSCOMMANDS = merge $(BCOMMANDS)
  359. X# all commands
  360. X
  361. XBOBJECTS = ci.o co.o ident.o rcs.o rcsdiff.o rcsedit.o\
  362. X    rcsfcmp.o rcsfnms.o rcsgen.o rcskeep.o rcskeys.o rcslex.o rcsmerge.o\
  363. X    rcsrev.o rcssyn.o rcsutil.o rlog.o snoop.o\
  364. X    rcssynTST.o rcsrevTST.o rcsfnmsTST.o rcsfcmpTST.o rcskeepTST.o
  365. X
  366. Xall:    $(RCSCOMMANDS)
  367. X
  368. XINSTALL = install
  369. X
  370. X$(BOBJECTS):    rcsbase.h
  371. X
  372. Xpartime.o maketime.o co.o ci.o rcs.o rlog.o rcsutil.o:        time.h
  373. X
  374. Xinstall:    all 
  375. X#    Save the old commands if you have any.
  376. X#    -cd ${RCSDIR}; mv $(RCSCOMMANDS) ${RCSDIR}$(OLDDIR)
  377. X    ${INSTALL} -m 775 -o root -s ci ${RCSDIR}
  378. X    ${INSTALL} -m 775 -o root -s ident ${RCSDIR}
  379. X    ${INSTALL} -m 775 -o root -s rcs ${RCSDIR}
  380. X    ${INSTALL} -m 775 -o root -s rcsdiff ${RCSDIR}
  381. X    ${INSTALL} -m 775 -o root -s rcsmerge ${RCSDIR}
  382. X    ${INSTALL} -m 775 -o root -s rlog ${RCSDIR}
  383. X    ${INSTALL} -m 775 -o root -s co ${RCSDIR}
  384. X    ${INSTALL} -m 775 -o root -c merge ${RCSDIR}
  385. X#    ${INSTALL} -m 775 -o root -c rcsclean ${RCSDIR}
  386. X#    ${INSTALL} -m 775 -o root -c rcsfreeze.sh ${RCSDIR}/rcsfreeze
  387. X
  388. Xinstallog:    installsnoop install
  389. X
  390. Xinstallsnoop:    snoop
  391. X    install -s snoop ${RCSDIR}$(SNOOP)
  392. X    chmod u+s ${RCSDIR}$(SNOOP)
  393. X    touch ${RCSDIR}$(SNOOPFILE)
  394. X    chmod 644 ${RCSDIR}$(SNOOPFILE)
  395. X# CAUTION: You may have to do a chown of SNOOP and SNOOPFILE (if not owned by root).
  396. Xlint: ci.lint co.lint ident.lint rlog.lint rcs.lint rcsdiff.lint rcsmerge.lint snoop.lint
  397. X
  398. Xclean:
  399. X    -rm -f *.o; rm -f $(RCSCOMMANDS) snoop
  400. X
  401. XCIFILES = ci.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o rcskeep.o rcsfcmp.o
  402. X
  403. XCISRC = ci.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c rcskeep.c rcsfcmp.c
  404. X
  405. Xci.lint:
  406. X    $(LINT) $(CISRC)
  407. X    
  408. Xci:    $(CIFILES)
  409. X    ${CC} $(LDFLAGS) -o ci $(CIFILES)
  410. X
  411. XCOFILES = co.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o
  412. X
  413. XCOSRC = co.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c
  414. Xco.lint:
  415. X    $(LINT) $(COSRC)
  416. Xco:    $(COFILES)
  417. X    ${CC} $(LDFLAGS) -o co $(COFILES)
  418. X
  419. Xident:    ident.o rcskeys.o
  420. X    ${CC} $(LDFLAGS) -o ident ident.o rcskeys.o
  421. X
  422. Xident.lint:
  423. X    $(LINT) ident.c rcskeys.c
  424. X
  425. Xmerge:    merge.sh
  426. X    sed -e '/^#/d' \
  427. X        -e 's:DIFF=.*$$:DIFF=$(DIFF):' \
  428. X        -e 's:DIFF3=.*$$:DIFF3=$(DIFF3):' \
  429. X        merge.sh > merge
  430. X#    This takes out the comment lines and substitutes in DIFF and DIFF3.
  431. X#    (Comments are not permitted in some older shells.)
  432. X    chmod 755 merge
  433. X
  434. XRLOG = rlog.o rcslex.o rcssyn.o rcsrev.o rcsutil.o partime.o maketime.o rcsfnms.o
  435. XRLOGSRC = rlog.c rcslex.c rcssyn.c rcsrev.c rcsutil.c partime.c maketime.c rcsfnms.c
  436. Xrlog:    $(RLOG)
  437. X    ${CC} $(LDFLAGS) -o rlog $(RLOG)
  438. X
  439. Xrlog.lint:
  440. X    $(LINT) $(RLOGSRC)
  441. X
  442. XRCS = rcs.o rcslex.o rcssyn.o rcsrev.o rcsutil.o rcsgen.o rcsedit.o rcskeys.o rcsfnms.o
  443. X
  444. XRCSSRC = rcs.c rcslex.c rcssyn.c rcsrev.c rcsutil.c rcsgen.c rcsedit.c rcskeys.c rcsfnms.c
  445. Xrcs:    $(RCS)
  446. X    ${CC} $(LDFLAGS) -o rcs $(RCS)
  447. X
  448. Xrcs.lint:
  449. X    $(LINT) $(RCSSRC)
  450. X
  451. Xrcsclean:    rcsclean.sh
  452. X    sed -e '/^#/d' rcsclean.sh > rcsclean
  453. X#    This takes out the comments (not permitted in older shells).
  454. X    chmod 755 rcsclean
  455. X
  456. XRCSDIFF = rcsdiff.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o
  457. XRCSDIFFSRC = rcsdiff.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c
  458. X
  459. Xrcsdiff:    $(RCSDIFF)
  460. X    ${CC} ${LDFLAGS} -o rcsdiff $(RCSDIFF)
  461. X
  462. Xrcsdiff.lint:
  463. X    $(LINT) $(RCSDIFFSRC)
  464. XRCSMERGE = rcsmerge.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o
  465. XRCSMERGESRC = rcsmerge.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c
  466. Xrcsmerge:    $(RCSMERGE)
  467. X    ${CC} ${LDFLAGS} -o rcsmerge $(RCSMERGE)
  468. Xrcsmerge.lint:
  469. X    $(LINT) $(RCSMERGESRC)
  470. X    
  471. Xsnoop:    snoop.o
  472. X    ${CC} ${LDFLAGS} -o snoop snoop.o
  473. Xsnoop.lint:
  474. X    $(LINT) snoop.c
  475. X
  476. XSOURCE=    ci.c co.c curdir.c ident.c maketime.c partime.c rcs.c \
  477. X    rcsclean.c rcsdiff.c rcsedit.c rcsfcmp.c rcsfnms.c rcsgen.c \
  478. X    rcskeep.c rcskeys.c rcslex.c rcsmerge.c rcsrev.c rcssyn.c rcsutil.c \
  479. X    rlog.c snoop.c
  480. X
  481. XHFILES=    rcsbase.h time.h
  482. X
  483. Xdepend:    ${SOURCE} ${HFILES}
  484. X    (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
  485. X     cc -M ${CFLAGS} ${SOURCE} | sed 's/\.\///; /\//d' \
  486. X    ) >Makefile.new
  487. X    cp Makefile Makefile.bak
  488. X    cp Makefile.new Makefile
  489. X    rm -f Makefile.new
  490. X
  491. X
  492. X# DO NOT DELETE THIS LINE - 
  493. Xci.o: ci.c
  494. Xci.o: rcsbase.h
  495. Xci.o: time.h
  496. Xco.o: co.c
  497. Xco.o: rcsbase.h
  498. Xco.o: time.h
  499. Xcurdir.o: curdir.c
  500. Xcurdir.o: rcsbase.h
  501. Xident.o: ident.c
  502. Xident.o: rcsbase.h
  503. Xmaketime.o: maketime.c
  504. Xmaketime.o: rcsbase.h
  505. Xmaketime.o: time.h
  506. Xpartime.o: partime.c
  507. Xpartime.o: time.h
  508. Xrcs.o: rcs.c
  509. Xrcs.o: rcsbase.h
  510. Xrcsclean.o: rcsclean.c
  511. Xrcsclean.o: rcsbase.h
  512. Xrcsdiff.o: rcsdiff.c
  513. Xrcsdiff.o: rcsbase.h
  514. Xrcsedit.o: rcsedit.c
  515. Xrcsedit.o: rcsbase.h
  516. Xrcsfcmp.o: rcsfcmp.c
  517. Xrcsfcmp.o: rcsbase.h
  518. Xrcsfnms.o: rcsfnms.c
  519. Xrcsfnms.o: rcsbase.h
  520. Xrcsgen.o: rcsgen.c
  521. Xrcsgen.o: rcsbase.h
  522. Xrcskeep.o: rcskeep.c
  523. Xrcskeep.o: rcsbase.h
  524. Xrcskeys.o: rcskeys.c
  525. Xrcskeys.o: rcsbase.h
  526. Xrcslex.o: rcslex.c
  527. Xrcslex.o: rcsbase.h
  528. Xrcsmerge.o: rcsmerge.c
  529. Xrcsmerge.o: rcsbase.h
  530. Xrcsrev.o: rcsrev.c
  531. Xrcsrev.o: rcsbase.h
  532. Xrcssyn.o: rcssyn.c
  533. Xrcssyn.o: rcsbase.h
  534. Xrcsutil.o: rcsutil.c
  535. Xrcsutil.o: rcsbase.h
  536. Xrlog.o: rlog.c
  537. Xrlog.o: time.h
  538. Xrlog.o: rcsbase.h
  539. Xsnoop.o: snoop.c
  540. Xsnoop.o: rcsbase.h
  541. X@
  542. X
  543. X
  544. X1.13.2.1
  545. Xlog
  546. X@Start of Amiga RCS port branch.
  547. X@
  548. Xtext
  549. X@d1 1
  550. Xa1 1
  551. X#$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/Makefile,v 1.13.1.2 89/08/11 02:15:34 rsbx Exp Locker: rsbx $
  552. Xd40 2
  553. Xa41 2
  554. XDIFF      = /usr/local/bin/diff
  555. XDIFF3     = /usr/local/bin/diff3
  556. Xd45 1
  557. Xa45 1
  558. XRCSDIR  = /u/softeng/rsbx/.bin
  559. Xd50 1
  560. Xa50 1
  561. X#OLDDIR    = /usr/old/bin
  562. Xd66 1
  563. Xa66 1
  564. XSIGNAL_TYPE = void
  565. Xd89 2
  566. Xa90 2
  567. X#SNOOPFILE = /usr/log/rcslog/log
  568. X#SNOOP    = /usr/local/bin/snoop
  569. Xd92 1
  570. Xa92 1
  571. XDEFINES= $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' 
  572. Xd258 48
  573. Xa305 22
  574. Xci.c:
  575. Xco.c:
  576. Xcurdir.c:
  577. Xident.c:
  578. Xmaketime.c:
  579. Xpartime.c:
  580. Xrcs.c:
  581. Xrcsclean.c:
  582. Xrcsdiff.c:
  583. Xrcsedit.c:
  584. Xrcsfcmp.c:
  585. Xrcsfnms.c:
  586. Xrcsgen.c:
  587. Xrcskeep.c:
  588. Xrcskeys.c:
  589. Xrcslex.c:
  590. Xrcsmerge.c:
  591. Xrcsrev.c:
  592. Xrcssyn.c:
  593. Xrcsutil.c:
  594. Xrlog.c:
  595. Xsnoop.c:
  596. X@
  597. X
  598. X
  599. X1.13.2.2
  600. Xlog
  601. X@Restructured for use with LMK.
  602. X@
  603. Xtext
  604. X@d1 1
  605. Xa1 1
  606. X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.1 89/10/13 19:16:09 rsbx Exp Locker: rsbx $
  607. Xa18 17
  608. X.SILENT:
  609. X
  610. XCC1=lc1
  611. XCC2=go
  612. XCC3=lc2
  613. XC1FLAGS    = -j85i -d1
  614. XC2FLAGS    =
  615. XC3FLAGS    =
  616. X
  617. X.c.o:
  618. X    $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $*
  619. X    $(CC2) -. $(C2FLAGS) QUAD:$*.q
  620. X    $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q
  621. X
  622. X#.c.o:
  623. X#    $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $*
  624. X#    $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q
  625. Xd24 1
  626. Xd40 2
  627. Xa41 2
  628. XDIFF      = RCS:diff
  629. XDIFF3     = RCS:diff3
  630. Xd45 1
  631. Xa45 1
  632. XRCSDIR  = RCS:
  633. Xd61 1
  634. Xa61 2
  635. XOS    = -dAMIGA
  636. XARGS    = -dSTDARGS
  637. Xd78 1
  638. Xa78 2
  639. XLDFLAGS   = quiet batch
  640. XLDLIBS    = LIB:lc.lib LIB:amiga.lib
  641. Xd92 4
  642. Xa95 2
  643. XDEFINES    = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge"
  644. XCFLAGS    = $(DEFINES)
  645. Xd123 1
  646. Xa123 1
  647. XRCSCOMMANDS = $(BCOMMANDS)
  648. Xd126 4
  649. Xd133 1
  650. Xd135 28
  651. Xd164 1
  652. Xa164 3
  653. X    -rm -f *.o
  654. X    -rm -f $(RCSCOMMANDS) snoop
  655. X    -rm -f *.tmp
  656. Xd166 1
  657. Xd168 1
  658. Xa168 6
  659. XCIOBJ = ci.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o rcskeep.o rcsfcmp.o amiga.o
  660. XCISRC = ci.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c rcskeep.c rcsfcmp.c amiga.c
  661. Xci:    $(CIOBJ)
  662. X    -delete $@@
  663. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(CIOBJ) LIB $(LDLIBS)
  664. X    rename $@@.tmp $@@
  665. Xd170 5
  666. Xd176 1
  667. Xa176 6
  668. XCOOBJ = co.o rcslex.o rcssyn.o rcsgen.o rcsedit.o rcskeys.o rcsrev.o rcsutil.o rcsfnms.o partime.o maketime.o amiga.o
  669. XCOSRC = co.c rcslex.c rcssyn.c rcsgen.c rcsedit.c rcskeys.c rcsrev.c rcsutil.c rcsfnms.c partime.c maketime.c amiga.c
  670. Xco:    $(COOBJ)
  671. X    -delete $@@
  672. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(COOBJ) LIB $(LDLIBS)
  673. X    rename $@@.tmp $@@
  674. Xd178 5
  675. Xa182 6
  676. XIDENTOBJ = ident.o rcskeys.o
  677. XIDENTSRC = ident.c rcskeys.c
  678. Xident:    $(IDENTOBJ)
  679. X    -delete $@@
  680. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(IDENTOBJ) LIB $(LDLIBS)
  681. X    rename $@@.tmp $@@
  682. Xd184 2
  683. Xd187 2
  684. Xa188 6
  685. XRLOGOBJ = rlog.o rcslex.o rcssyn.o rcsrev.o rcsutil.o partime.o maketime.o rcsfnms.o amiga.o
  686. XRLOGSRC = rlog.c rcslex.c rcssyn.c rcsrev.c rcsutil.c partime.c maketime.c rcsfnms.c amiga.c
  687. Xrlog:    $(RLOGOBJ)
  688. X    -delete $@@
  689. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RLOGOBJ) LIB $(LDLIBS)
  690. X    rename $@@.tmp $@@
  691. Xd190 8
  692. Xd199 4
  693. Xa202 6
  694. XRCSOBJ = rcs.o rcslex.o rcssyn.o rcsrev.o rcsutil.o rcsgen.o rcsedit.o rcskeys.o rcsfnms.o amiga.o
  695. XRCSSRC = rcs.c rcslex.c rcssyn.c rcsrev.c rcsutil.c rcsgen.c rcsedit.c rcskeys.c rcsfnms.c amiga.c
  696. Xrcs:    $(RCSOBJ)
  697. X    -delete $@@
  698. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSOBJ) LIB $(LDLIBS)
  699. X    rename $@@.tmp $@@
  700. Xd204 2
  701. Xd207 1
  702. Xa207 6
  703. XRCSDIFFOBJ = rcsdiff.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o amiga.o
  704. XRCSDIFFSRC = rcsdiff.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c amiga.c
  705. Xrcsdiff:    $(RCSDIFFOBJ)
  706. X    -delete $@@
  707. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSDIFFOBJ) LIB $(LDLIBS)
  708. X    rename $@@.tmp $@@
  709. Xd209 3
  710. Xd213 22
  711. Xa234 6
  712. XRCSMERGEOBJ = rcsmerge.o rcsutil.o rcsfnms.o rcsrev.o rcssyn.o rcslex.o amiga.o
  713. XRCSMERGESRC = rcsmerge.c rcsutil.c rcsfnms.c rcsrev.c rcssyn.c rcslex.c amiga.c
  714. Xrcsmerge:    $(RCSMERGEOBJ)
  715. X    -delete $@@
  716. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(RCSMERGEOBJ) LIB $(LDLIBS)
  717. X    rename $@@.tmp $@@
  718. Xd236 4
  719. Xa239 6
  720. XSNOOPOBJ = snoop.o
  721. XSNOOPSRC = snoop.c
  722. Xsnoop:    $(SNOOPOBJ)
  723. X    -delete $@@
  724. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:c.o $(SNOOPOBJ) LIB $(LDLIBS)
  725. X    rename $@@.tmp $@@
  726. Xa240 1
  727. X
  728. Xd244 1
  729. Xa244 1
  730. X    rlog.c snoop.c amiga.c
  731. Xd246 1
  732. Xa246 1
  733. XHFILES=    rcsbase.h time.h stat.h
  734. Xd250 1
  735. Xa250 1
  736. X     cc -Em ${CFLAGS} ${SOURCE} | sed 's/\.\///; /\//d' \
  737. Xd258 22
  738. Xa279 55
  739. Xci.o: ci.c
  740. Xci.o: rcsbase.h
  741. Xci.o: stat.h
  742. Xci.o: time.h
  743. Xco.o: co.c
  744. Xco.o: rcsbase.h
  745. Xco.o: stat.h
  746. Xco.o: time.h
  747. Xcurdir.o: curdir.c
  748. Xcurdir.o: rcsbase.h
  749. Xident.o: ident.c
  750. Xident.o: rcsbase.h
  751. Xmaketime.o: maketime.c
  752. Xmaketime.o: rcsbase.h
  753. Xmaketime.o: time.h
  754. Xpartime.o: partime.c
  755. Xpartime.o: time.h
  756. Xrcs.o: rcs.c
  757. Xrcs.o: stat.h
  758. Xrcs.o: rcsbase.h
  759. Xrcsclean.o: rcsclean.c
  760. Xrcsclean.o: rcsbase.h
  761. Xrcsdiff.o: rcsdiff.c
  762. Xrcsdiff.o: rcsbase.h
  763. Xrcsedit.o: rcsedit.c
  764. Xrcsedit.o: rcsbase.h
  765. Xrcsfcmp.o: rcsfcmp.c
  766. Xrcsfcmp.o: rcsbase.h
  767. Xrcsfnms.o: rcsfnms.c
  768. Xrcsfnms.o: stat.h
  769. Xrcsfnms.o: rcsbase.h
  770. Xrcsgen.o: rcsgen.c
  771. Xrcsgen.o: rcsbase.h
  772. Xrcskeep.o: rcskeep.c
  773. Xrcskeep.o: rcsbase.h
  774. Xrcskeys.o: rcskeys.c
  775. Xrcskeys.o: rcsbase.h
  776. Xrcslex.o: rcslex.c
  777. Xrcslex.o: rcsbase.h
  778. Xrcsmerge.o: rcsmerge.c
  779. Xrcsmerge.o: rcsbase.h
  780. Xrcsrev.o: rcsrev.c
  781. Xrcsrev.o: rcsbase.h
  782. Xrcssyn.o: rcssyn.c
  783. Xrcssyn.o: rcsbase.h
  784. Xrcsutil.o: rcsutil.c
  785. Xrcsutil.o: stat.h
  786. Xrcsutil.o: rcsbase.h
  787. Xrlog.o: rlog.c
  788. Xrlog.o: time.h
  789. Xrlog.o: rcsbase.h
  790. Xsnoop.o: snoop.c
  791. Xsnoop.o: rcsbase.h
  792. Xamiga.o: amiga.c
  793. Xamiga.o: stat.h
  794. X@
  795. X
  796. X
  797. X1.13.2.3
  798. Xlog
  799. X@Many changes. Added merge to list of commands.
  800. X@
  801. Xtext
  802. X@d1 1
  803. Xa1 1
  804. X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.2 89/10/15 15:38:02 rsbx Exp $
  805. Xd24 1
  806. Xa24 1
  807. XC1FLAGS    = -j85i -d3
  808. Xd27 6
  809. Xa32 1
  810. X#
  811. Xa34 1
  812. X#    $(CC2) -. $(C2FLAGS) QUAD:$*.q
  813. Xa36 3
  814. X.c.o:
  815. X    $(CC1) -. $(C1FLAGS) $(CFLAGS) -oQUAD: $*
  816. X    $(CC3) -. $(C3FLAGS) -o$*.o QUAD:$*.q
  817. Xa40 1
  818. X#
  819. Xd49 1
  820. Xa49 6
  821. X# 1.  Figure out where to put the RCS commands; define RCSDIR accordingly.
  822. X
  823. XRCSDIR  = RCS:
  824. X
  825. X
  826. X# 2. Early version of diff did not support options needed by RCS.
  827. Xd56 2
  828. Xa57 2
  829. XDIFF    = ${RCSDIR}diff
  830. XDIFF3    = ${RCSDIR}diff3
  831. Xd59 1
  832. Xa59 1
  833. XED    = ${RCSDIR}ked
  834. Xd61 3
  835. Xd95 2
  836. Xa96 2
  837. XLDFLAGS   = quiet batch nodebug
  838. XLDLIBS    = LIB:rsbx.lib LIB:lc.lib LIB:amiga.lib
  839. Xd110 1
  840. Xa110 1
  841. XDEFINES    = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dDIFF3="$(DIFF3)" -dED="$(ED)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge"
  842. Xd136 1
  843. Xa136 1
  844. XBCOMMANDS   =   ci co ident merge rcs rcsdiff rcsmerge rlog
  845. Xa145 11
  846. Xinstall:
  847. X    copy ci       to RCS:
  848. X    copy co       to RCS:
  849. X    copy ident    to RCS:
  850. X    copy merge    to RCS:
  851. X    copy rcs      to RCS:
  852. X    copy rcsdiff  to RCS:
  853. X    copy rcsmerge to RCS:
  854. X    copy rlog     to RCS:
  855. X
  856. X
  857. Xd147 3
  858. Xa149 3
  859. X    -delete \#?.o
  860. X    -delete $(RCSCOMMANDS) snoop
  861. X    -delete \#?.tmp
  862. Xd153 2
  863. Xa154 1
  864. Xci:    $(CIOBJ) $(LDLIBS)
  865. Xd156 1
  866. Xa156 1
  867. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(CIOBJ) LIB $(LDLIBS)
  868. Xd161 2
  869. Xa162 1
  870. Xco:    $(COOBJ) $(LDLIBS)
  871. Xd164 1
  872. Xa164 1
  873. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(COOBJ) LIB $(LDLIBS)
  874. Xd168 2
  875. Xa169 1
  876. Xident:    $(IDENTOBJ) $(LDLIBS)
  877. Xd171 1
  878. Xa171 1
  879. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(IDENTOBJ) LIB $(LDLIBS)
  880. Xa174 7
  881. XMERGEOBJ = merge.o
  882. Xmerge:    $(MERGEOBJ) $(LDLIBS)
  883. X    -delete $@@
  884. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(MERGEOBJ) LIB $(LDLIBS)
  885. X    rename $@@.tmp $@@
  886. X
  887. X
  888. Xd176 2
  889. Xa177 1
  890. Xrlog:    $(RLOGOBJ) $(LDLIBS)
  891. Xd179 1
  892. Xa179 1
  893. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RLOGOBJ) LIB $(LDLIBS)
  894. Xd184 2
  895. Xa185 1
  896. Xrcs:    $(RCSOBJ) $(LDLIBS)
  897. Xd187 1
  898. Xa187 1
  899. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSOBJ) LIB $(LDLIBS)
  900. Xd192 2
  901. Xa193 1
  902. Xrcsdiff:    $(RCSDIFFOBJ) $(LDLIBS)
  903. Xd195 1
  904. Xa195 1
  905. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSDIFFOBJ) LIB $(LDLIBS)
  906. Xd200 2
  907. Xa201 1
  908. Xrcsmerge:    $(RCSMERGEOBJ) $(LDLIBS)
  909. Xd203 1
  910. Xa203 1
  911. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(RCSMERGEOBJ) LIB $(LDLIBS)
  912. Xd207 2
  913. Xa208 1
  914. Xsnoop:    $(SNOOPOBJ) $(LDLIBS)
  915. Xd210 1
  916. Xa210 1
  917. X    ${LD} $(LDFLAGS) TO $@@.tmp FROM LIB:xc.o $(SNOOPOBJ) LIB $(LDLIBS)
  918. Xd214 1
  919. Xa214 1
  920. XSOURCE=    ci.c co.c curdir.c ident.c maketime.c merge.c partime.c rcs.c \
  921. Xa245 1
  922. Xmerge.o: merge.c
  923. X@
  924. X
  925. X
  926. X1.13.2.4
  927. Xlog
  928. X@Added new compile time switch LINK for RCS_link support.
  929. X@
  930. Xtext
  931. X@d1 1
  932. Xa1 1
  933. X#$Header: /u/softeng/rsbx/rcs/amiga/RCS/Makefile,v 1.13.2.3 89/11/03 20:53:51 rsbx Exp Locker: rsbx $
  934. Xa51 1
  935. XRCSLINK = -dLINK
  936. Xd53 1
  937. Xd112 1
  938. Xa112 1
  939. XDEFINES    = $(OS) $(ARGS) -dSIGNAL_TYPE=$(SIGNAL_TYPE) -dSTRICT_LOCKING=$(LOCKING) -dDIFF="$(DIFF)" -dDIFF3="$(DIFF3)" -dED="$(ED)" -dCO="${RCSDIR}co" -dMERGE="${RCSDIR}merge" $(RCSLINK)
  940. X@
  941. X
  942. X
  943. X1.13.1.1
  944. Xlog
  945. X@Start of cbmvax RCS source branch.
  946. X@
  947. Xtext
  948. X@d1 1
  949. Xa1 1
  950. X#$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/Makefile,v 1.13 89/05/02 14:53:40 narten Exp $
  951. X@
  952. X
  953. X
  954. X1.13.1.2
  955. Xlog
  956. X@Modified for cbmvax's environment and my testing.
  957. X@
  958. Xtext
  959. X@d1 1
  960. Xa1 1
  961. X#$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/Makefile,v 1.13.1.1 89/08/11 01:41:03 rsbx Exp Locker: rsbx $
  962. Xd40 2
  963. Xa41 2
  964. XDIFF      = /usr/local/bin/diff
  965. XDIFF3     = /usr/local/bin/diff3
  966. Xd45 1
  967. Xa45 1
  968. XRCSDIR  = /u/softeng/rsbx/.bin
  969. Xd50 1
  970. Xa50 1
  971. X#OLDDIR    = /usr/old/bin
  972. Xd66 1
  973. Xa66 1
  974. XSIGNAL_TYPE = void
  975. Xd89 2
  976. Xa90 2
  977. X#SNOOPFILE = /usr/log/rcslog/log
  978. X#SNOOP    = /usr/local/bin/snoop
  979. Xd92 1
  980. Xa92 1
  981. XDEFINES= $(OS) -DSIGNAL_TYPE=$(SIGNAL_TYPE) -DSTRICT_LOCKING=$(LOCKING) -DDIFF='"$(DIFF)"' -DCO='"${RCSDIR}/co"' -DMERGE='"${RCSDIR}/merge"' 
  982. Xd258 48
  983. Xa305 22
  984. Xci.c:
  985. Xco.c:
  986. Xcurdir.c:
  987. Xident.c:
  988. Xmaketime.c:
  989. Xpartime.c:
  990. Xrcs.c:
  991. Xrcsclean.c:
  992. Xrcsdiff.c:
  993. Xrcsedit.c:
  994. Xrcsfcmp.c:
  995. Xrcsfnms.c:
  996. Xrcsgen.c:
  997. Xrcskeep.c:
  998. Xrcskeys.c:
  999. Xrcslex.c:
  1000. Xrcsmerge.c:
  1001. Xrcsrev.c:
  1002. Xrcssyn.c:
  1003. Xrcsutil.c:
  1004. Xrlog.c:
  1005. Xsnoop.c:
  1006. X@
  1007. SHAR_EOF
  1008. echo "extracting rcs/rcs.rcsfiles/co.c,v"
  1009. sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/co.c,v
  1010. Xhead     4.7;
  1011. Xbranch   4.7.2;
  1012. Xaccess   ;
  1013. Xsymbols  amiga_rcs:4.7.2 cbmvax_source:4.7.1 uunet_june89_dist:4.7;
  1014. Xlocks    ; strict;
  1015. Xcomment  @ * @;
  1016. X
  1017. X
  1018. X4.7
  1019. Xdate     89.05.01.15.11.41;  author narten;  state Exp;
  1020. Xbranches 4.7.1.1 4.7.2.1;
  1021. Xnext     ;
  1022. X
  1023. X4.7.1.1
  1024. Xdate     89.08.11.01.41.39;  author rsbx;  state Exp;
  1025. Xbranches ;
  1026. Xnext     ;
  1027. X
  1028. X4.7.2.1
  1029. Xdate     89.10.13.19.17.21;  author rsbx;  state Exp;
  1030. Xbranches ;
  1031. Xnext     4.7.2.2;
  1032. X
  1033. X4.7.2.2
  1034. Xdate     89.10.15.15.43.07;  author rsbx;  state Exp;
  1035. Xbranches ;
  1036. Xnext     4.7.2.3;
  1037. X
  1038. X4.7.2.3
  1039. Xdate     89.10.30.13.37.50;  author rsbx;  state Exp;
  1040. Xbranches ;
  1041. Xnext     4.7.2.4;
  1042. X
  1043. X4.7.2.4
  1044. Xdate     89.11.01.14.42.12;  author rsbx;  state Exp;
  1045. Xbranches ;
  1046. Xnext     ;
  1047. X
  1048. X
  1049. Xdesc
  1050. X@RCS checkout operation.
  1051. X@
  1052. X
  1053. X
  1054. X
  1055. X4.7
  1056. Xlog
  1057. X@checked in with -k by rsbx at 89.08.10.16.01.05.
  1058. X@
  1059. Xtext
  1060. X@/* Copyright (C) 1982, 1988, 1989 Walter Tichy
  1061. X * All rights reserved.
  1062. X *
  1063. X * Redistribution and use in source and binary forms are permitted
  1064. X * provided that the above copyright notice and this paragraph are
  1065. X * duplicated in all such forms and that any documentation,
  1066. X * advertising materials, and other materials related to such
  1067. X * distribution and use acknowledge that the software was developed
  1068. X * by Walter Tichy.
  1069. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1070. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1071. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1072. X *
  1073. X * Report all problems and direct all questions to:
  1074. X *   rcs-bugs@@cs.purdue.edu
  1075. X * 
  1076. X
  1077. X
  1078. X
  1079. X
  1080. X
  1081. X
  1082. X
  1083. X*/
  1084. X
  1085. X/*
  1086. X *                     RCS checkout operation
  1087. X */
  1088. X#ifndef lint
  1089. Xstatic char rcsid[]=
  1090. X"$Header: /usr/src/local/bin/rcs/src/RCS/co.c,v 4.7 89/05/01 15:11:41 narten Exp $ Purdue CS";
  1091. X#endif
  1092. X/*****************************************************************************
  1093. X *                       check out revisions from RCS files
  1094. X *****************************************************************************
  1095. X */
  1096. X
  1097. X
  1098. X/* $Log:    co.c,v $
  1099. X * Revision 4.7  89/05/01  15:11:41  narten
  1100. X * changed copyright header to reflect current distribution rules
  1101. X * 
  1102. X * Revision 4.6  88/11/08  12:02:31  narten
  1103. X * changes from  eggert@@sm.unisys.com (Paul Eggert)
  1104. X * 
  1105. X * Revision 4.6  88/08/09  19:12:15  eggert
  1106. X * Fix "co -d" core dump; rawdate wasn't always initialized.
  1107. X * Use execv(), not system(); fix putchar('\0') and diagnose() botches; remove lint
  1108. X * 
  1109. X * Revision 4.5  87/12/18  11:35:40  narten
  1110. X * lint cleanups (from Guy Harris)
  1111. X * 
  1112. X * Revision 4.4  87/10/18  10:20:53  narten
  1113. X * Updating version numbers changes relative to 1.1, are actually
  1114. X * relative to 4.2
  1115. X * 
  1116. X * Revision 1.3  87/09/24  13:58:30  narten
  1117. X * Sources now pass through lint (if you ignore printf/sprintf/fprintf 
  1118. X * warnings)
  1119. X * 
  1120. X * Revision 1.2  87/03/27  14:21:38  jenkins
  1121. X * Port to suns
  1122. X * 
  1123. X * Revision 1.1  84/01/23  14:49:58  kcs
  1124. X * Initial revision
  1125. X * 
  1126. X * Revision 4.2  83/12/05  13:39:48  wft
  1127. X * made rewriteflag external.
  1128. X * 
  1129. X * Revision 4.1  83/05/10  16:52:55  wft
  1130. X * Added option -u and -f.
  1131. X * Added handling of default branch.
  1132. X * Replaced getpwuid() with getcaller().
  1133. X * Removed calls to stat(); now done by pairfilenames().
  1134. X * Changed and renamed rmoldfile() to rmworkfile().
  1135. X * Replaced catchints() calls with restoreints(), unlink()--link() with rename();
  1136. X * 
  1137. X * Revision 3.7  83/02/15  15:27:07  wft
  1138. X * Added call to fastcopy() to copy remainder of RCS file.
  1139. X *
  1140. X * Revision 3.6  83/01/15  14:37:50  wft
  1141. X * Added ignoring of interrupts while RCS file is renamed; this avoids
  1142. X * deletion of RCS files during the unlink/link window.
  1143. X *
  1144. X * Revision 3.5  82/12/08  21:40:11  wft
  1145. X * changed processing of -d to use DATEFORM; removed actual from
  1146. X * call to preparejoin; re-fixed printing of done at the end.
  1147. X *
  1148. X * Revision 3.4  82/12/04  18:40:00  wft
  1149. X * Replaced getdelta() with gettree(), SNOOPDIR with SNOOPFILE.
  1150. X * Fixed printing of "done".
  1151. X *
  1152. X * Revision 3.3  82/11/28  22:23:11  wft
  1153. X * Replaced getlogin() with getpwuid(), flcose() with ffclose(),
  1154. X * %02d with %.2d, mode generation for working file with WORKMODE.
  1155. X * Fixed nil printing. Fixed -j combined with -l and -p, and exit
  1156. X * for non-existing revisions in preparejoin().
  1157. X *
  1158. X * Revision 3.2  82/10/18  20:47:21  wft
  1159. X * Mode of working file is now maintained even for co -l, but write permission
  1160. X * is removed.
  1161. X * The working file inherits its mode from the RCS file, plus write permission
  1162. X * for the owner. The write permission is not given if locking is strict and
  1163. X * co does not lock.
  1164. X * An existing working file without write permission is deleted automatically.
  1165. X * Otherwise, co asks (empty answer: abort co).
  1166. X * Call to getfullRCSname() added, check for write error added, call
  1167. X * for getlogin() fixed.
  1168. X *
  1169. X * Revision 3.1  82/10/13  16:01:30  wft
  1170. X * fixed type of variables receiving from getc() (char -> int).
  1171. X * removed unused variables.
  1172. X */
  1173. X
  1174. X
  1175. X
  1176. X
  1177. X#include "rcsbase.h"
  1178. X#include "time.h"
  1179. X#include <sys/types.h>
  1180. X#include <sys/stat.h>
  1181. X
  1182. X#ifndef lint
  1183. Xstatic char rcsbaseid[] = RCSBASE;
  1184. X#endif
  1185. Xstatic char co[] = CO;
  1186. Xstatic char merge[] = MERGE;
  1187. X
  1188. Xextern FILE * fopen();
  1189. Xextern int    rename();
  1190. Xextern char * getcaller();          /*get login of caller                   */
  1191. Xextern struct hshentry * genrevs(); /*generate delta numbers                */
  1192. Xextern char * getancestor();
  1193. Xextern int  nextc;                  /*next input character                  */
  1194. Xextern int  nerror;                 /*counter for errors                    */
  1195. Xextern char Kdesc[];            /*keyword for description            */
  1196. Xextern char * buildrevision();      /*constructs desired revision           */
  1197. Xextern int    buildjoin();          /*join several revisions                */
  1198. Xextern char * mktempfile();         /*temporary file name generator         */
  1199. Xextern struct hshentry * findlock();/*find (and delete) a lock              */
  1200. Xextern struct lock * addlock();     /*add a new lock                        */
  1201. Xextern long   maketime();           /*convert parsed time to unix time.     */
  1202. Xextern struct tm * localtime();     /*convert unixtime into a tm-structure  */
  1203. Xextern FILE * finptr;               /* RCS input file                       */
  1204. Xextern FILE * frewrite;             /* new RCS file                         */
  1205. Xextern int    rewriteflag;          /* indicates whether input should be    */
  1206. X                    /* echoed to frewrite                   */
  1207. X
  1208. Xchar * newRCSfilename, * neworkfilename;
  1209. Xchar * RCSfilename, * workfilename;
  1210. Xextern struct stat RCSstat, workstat; /* file status of RCS and work file   */
  1211. Xextern int  haveRCSstat, haveworkstat;/* status indicators                  */
  1212. X
  1213. Xchar * date, * rev, * state, * author, * join;
  1214. Xchar finaldate[datelength];
  1215. X
  1216. Xint forceflag, lockflag, unlockflag, tostdout;
  1217. Xchar * caller;                        /* caller's login;                    */
  1218. Xextern quietflag;
  1219. X
  1220. Xchar numericrev[revlength];           /* holds expanded revision number     */
  1221. Xstruct hshentry * gendeltas[hshsize]; /* stores deltas to be generated      */
  1222. Xstruct hshentry * targetdelta;        /* final delta to be generated        */
  1223. X
  1224. Xchar * joinlist[joinlength];          /* pointers to revisions to be joined */
  1225. Xint lastjoin;                         /* index of last element in joinlist  */
  1226. X
  1227. Xmain (argc, argv)
  1228. Xint argc;
  1229. Xchar * argv[];
  1230. X{
  1231. X        int killock;                  /* indicates whether a lock is removed*/
  1232. X        char * cmdusage;
  1233. X        struct tm parseddate, *ftm;
  1234. X        char * rawdate;
  1235. X        long unixtime;
  1236. X
  1237. X    catchints();
  1238. X        cmdid = "co";
  1239. X    cmdusage = "command format:\nco -f[rev] -l[rev] -p[rev] -q[rev] -r[rev] -ddate -sstate -w[login] -jjoinlist file ...";
  1240. X        date = rev = state = author = join = nil;
  1241. X    forceflag = lockflag = unlockflag = tostdout = quietflag = false;
  1242. X    caller=getcaller();
  1243. X    rawdate = "";
  1244. X
  1245. X        while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
  1246. X                switch ((*argv)[1]) {
  1247. X
  1248. X                case 'r':
  1249. X                revno:  if ((*argv)[2]!='\0') {
  1250. X                                if (rev!=nil) warn("Redefinition of revision number");
  1251. X                                rev = (*argv)+2;
  1252. X                        }
  1253. X                        break;
  1254. X
  1255. X        case 'f':
  1256. X            forceflag=true;
  1257. X            goto revno;
  1258. X
  1259. X                case 'l':
  1260. X                        lockflag=true;
  1261. X                        if (unlockflag) {
  1262. X                                warn("-l has precedence over -u");
  1263. X                                unlockflag=false;
  1264. X                        }
  1265. X                        goto revno;
  1266. X
  1267. X                case 'u':
  1268. X                        unlockflag=true;
  1269. X                        if (lockflag) {
  1270. X                                warn("-l has precedence over -u");
  1271. X                                unlockflag=false;
  1272. X                        }
  1273. X                        goto revno;
  1274. X
  1275. X                case 'p':
  1276. X                        tostdout=true;
  1277. X                        goto revno;
  1278. X
  1279. X                case 'q':
  1280. X                        quietflag=true;
  1281. X                        goto revno;
  1282. X
  1283. X                case 'd':
  1284. X                        if ((*argv)[2]!='\0') {
  1285. X                                if (date!=nil) warn("Redefinition of -d option");
  1286. X                                rawdate=(*argv)+2;
  1287. X                        }
  1288. X                        /* process date/time */
  1289. X                        if (partime(rawdate,&parseddate)==0)
  1290. X                                faterror("Can't parse date/time: %s",rawdate);
  1291. X                        if ((unixtime=maketime(&parseddate))== 0L)
  1292. X                                faterror("Inconsistent date/time: %s",rawdate);
  1293. X                        ftm=localtime(&unixtime);
  1294. X                        VOID sprintf(finaldate,DATEFORM,
  1295. X                        ftm->tm_year,ftm->tm_mon+1,ftm->tm_mday,ftm->tm_hour,ftm->tm_min,ftm->tm_sec);
  1296. X                        date=finaldate;
  1297. X                        break;
  1298. X
  1299. X                case 'j':
  1300. X                        if ((*argv)[2]!='\0'){
  1301. X                                if (join!=nil)warn("Redefinition of -j option");
  1302. X                                join = (*argv)+2;
  1303. X                        }
  1304. X                        break;
  1305. X
  1306. X                case 's':
  1307. X                        if ((*argv)[2]!='\0'){
  1308. X                                if (state!=nil)warn("Redefinition of -s option");
  1309. X                                state = (*argv)+2;
  1310. X                        }
  1311. X                        break;
  1312. X
  1313. X                case 'w':
  1314. X                        if (author!=nil)warn("Redefinition of -w option");
  1315. X                        if ((*argv)[2]!='\0')
  1316. X                                author = (*argv)+2;
  1317. X                        else    author = caller;
  1318. X                        break;
  1319. X
  1320. X                default:
  1321. X                        faterror("unknown option: %s\n%s", *argv,cmdusage);
  1322. X
  1323. X                };
  1324. X        } /* end of option processing */
  1325. X
  1326. X        if (argc<1) faterror("No input file\n%s",cmdusage);
  1327. X
  1328. X        /* now handle all filenames */
  1329. X        do {
  1330. X        rewriteflag=false;
  1331. X        finptr=frewrite=NULL;
  1332. X        neworkfilename=nil;
  1333. X
  1334. X        if (!pairfilenames(argc,argv,true,tostdout)) continue;
  1335. X
  1336. X        /* now RCSfilename contains the name of the RCS file, and finptr
  1337. X         * the file descriptor. If tostdout is false, workfilename contains
  1338. X         * the name of the working file, otherwise undefined (not nil!).
  1339. X         * Also, RCSstat, workstat, and haveworkstat have been set.
  1340. X         */
  1341. X        diagnose("%s  -->  %s", RCSfilename,tostdout?"stdout":workfilename);
  1342. X
  1343. X
  1344. X        if (!tostdout && !trydiraccess(workfilename)) continue; /* give up */
  1345. X        if ((lockflag||unlockflag) && !checkaccesslist(caller)) continue;     /* give up */
  1346. X        if (!trysema(RCSfilename,lockflag||unlockflag)) continue;           /* give up */
  1347. X
  1348. X
  1349. X        gettree();  /* reads in the delta tree */
  1350. X
  1351. X        if (Head==nil) {
  1352. X                /* no revisions; create empty file */
  1353. X                diagnose("no revisions present; generating empty revision 0.0");
  1354. X                if (!tostdout)
  1355. X                        if (!creatempty()) continue;
  1356. X                /* Can't reserve a delta, so don't call addlock */
  1357. X        } else {
  1358. X                if (rev!=nil) {
  1359. X                        /* expand symbolic revision number */
  1360. X                        if (!expandsym(rev,numericrev))
  1361. X                                continue;
  1362. X        } elsif (unlockflag && (targetdelta=findlock(caller,false))!=nil) {
  1363. X            VOID strcpy(numericrev,targetdelta->num);
  1364. X                } elsif (Dbranch!=nil) {
  1365. X                        VOID strcpy(numericrev,Dbranch->num);
  1366. X        } else  numericrev[0]='\0'; /* empty */
  1367. X                /* get numbers of deltas to be generated */
  1368. X                if (!(targetdelta=genrevs(numericrev,date,author,state,gendeltas)))
  1369. X                        continue;
  1370. X                /* check reservations */
  1371. X                if (lockflag && !addlock(targetdelta,caller))
  1372. X                        continue;
  1373. X
  1374. X                if (unlockflag) {
  1375. X                        if((killock=rmlock(caller,targetdelta))== -1)
  1376. X                                continue;
  1377. X                } else {
  1378. X                        killock=0;
  1379. X                }
  1380. X
  1381. X                if (join && !preparejoin()) continue;
  1382. X
  1383. X        diagnose("revision %s%s",targetdelta->num,
  1384. X             lockflag?" (locked)":
  1385. X             unlockflag?" (unlocked)":"");
  1386. X
  1387. X                /* remove old working file if necessary */
  1388. X                if (!tostdout)
  1389. X                        if (!rmworkfile()) continue;
  1390. X
  1391. X                /* prepare for rewriting the RCS file */
  1392. X                if (lockflag||(killock==1)) {
  1393. X                        newRCSfilename=mktempfile(RCSfilename,NEWRCSFILE);
  1394. X                        if ((frewrite=fopen(newRCSfilename, "w"))==NULL) {
  1395. X                                error("Can't open file %s",newRCSfilename);
  1396. X                                continue;
  1397. X                        }
  1398. X                        putadmin(frewrite);
  1399. X                        puttree(Head,frewrite);
  1400. X                        VOID fprintf(frewrite, "\n\n%s%c",Kdesc,nextc);
  1401. X                        rewriteflag=true;
  1402. X                }
  1403. X
  1404. X                /* skip description */
  1405. X                getdesc(false); /* don't echo*/
  1406. X
  1407. X                if (!(neworkfilename=buildrevision(gendeltas,targetdelta,
  1408. X                      tostdout?(join!=nil?"/tmp/":(char *)nil):workfilename,true)))
  1409. X                                continue;
  1410. X
  1411. X                if ((lockflag||killock==1)&&nerror==0) {
  1412. X                        /* rewrite the rest of the RCSfile */
  1413. X                        fastcopy(finptr,frewrite);
  1414. X                        ffclose(frewrite); frewrite=NULL;
  1415. X            ignoreints();
  1416. X                        if (rename(newRCSfilename,RCSfilename)<0) {
  1417. X                                error("Can't rewrite %s; saved in: %s",
  1418. X                                RCSfilename, newRCSfilename);
  1419. X                                newRCSfilename[0]='\0'; /* avoid deletion*/
  1420. X                                restoreints();
  1421. X                                break;
  1422. X                        }
  1423. X                        newRCSfilename[0]='\0'; /* avoid re-deletion by cleanup()*/
  1424. X                        if (chmod(RCSfilename,RCSstat.st_mode & ~0222)<0)
  1425. X                            warn("Can't preserve mode of %s",RCSfilename);
  1426. X                        restoreints();
  1427. X                }
  1428. X
  1429. X#               ifdef SNOOPFILE
  1430. X                logcommand("co",targetdelta,gendeltas,caller);
  1431. X#               endif
  1432. X
  1433. X                if (join) {
  1434. X                        rmsema(); /* kill semaphore file so other co's can proceed */
  1435. X            if (!buildjoin(neworkfilename)) continue;
  1436. X                }
  1437. X                if (!tostdout) {
  1438. X            if (rename(neworkfilename,workfilename) <0) {
  1439. X                                error("Can't create %s; see %s",workfilename,neworkfilename);
  1440. X                                neworkfilename[0]= '\0'; /*avoid deletion*/
  1441. X                                continue;
  1442. X                        }
  1443. X            neworkfilename[0]= '\0'; /*avoid re-deletion by cleanup()*/
  1444. X        }
  1445. X        }
  1446. X    if (!tostdout)
  1447. X            if (chmod(workfilename, WORKMODE(RCSstat.st_mode))<0)
  1448. X                warn("Can't adjust mode of %s",workfilename);
  1449. X
  1450. X
  1451. X        if (!tostdout) diagnose("done");
  1452. X        } while (cleanup(),
  1453. X                 ++argv, --argc >=1);
  1454. X
  1455. X        exit(nerror!=0);
  1456. X
  1457. X}       /* end of main (co) */
  1458. X
  1459. X
  1460. X/*****************************************************************
  1461. X * The following routines are auxiliary routines
  1462. X *****************************************************************/
  1463. X
  1464. Xint rmworkfile()
  1465. X/* Function: unlinks workfilename, if it exists, under the following conditions:
  1466. X * If it is read-only, workfilename is unlinked.
  1467. X * Otherwise (file writable):
  1468. X *   if !quietmode asks the user whether to really delete it (default: fail);
  1469. X *   otherwise failure.
  1470. X * Returns false on failure to unlink, true otherwise.
  1471. X */
  1472. X{
  1473. X        int response, c;    /* holds user response to queries */
  1474. X
  1475. X        if (haveworkstat< 0)      /* File doesn't exist; set by pairfilenames*/
  1476. X            return (true);        /* No problem */
  1477. X
  1478. X    if ((workstat.st_mode & 0222)&&!forceflag) {    /* File is writable */
  1479. X            if (!quietflag) {
  1480. X                VOID fprintf(stderr,"writable %s exists; overwrite? [ny](n): ",workfilename);
  1481. X                /* must be stderr in case of IO redirect */
  1482. X                c=response=getchar();
  1483. X                while (!(c==EOF || c=='\n')) c=getchar(); /*skip rest*/
  1484. X                if (!(response=='y'||response=='Y')) {
  1485. X                        warn("checkout aborted.");
  1486. X                        return false;
  1487. X                }
  1488. X            } else {
  1489. X                error("writable %s exists; checkout aborted.",workfilename);
  1490. X                return false;
  1491. X            }
  1492. X        }
  1493. X    /* now unlink: either not writable, forceflag, or permission given */
  1494. X        if (unlink(workfilename) != 0) {            /* Remove failed   */
  1495. X            error("Can't unlink %s",workfilename);
  1496. X            return false;
  1497. X        }
  1498. X        return true;
  1499. X}
  1500. X
  1501. X
  1502. Xcreatempty()
  1503. X/* Function: creates an empty working file.
  1504. X * First, removes an existing working file with rmworkfile().
  1505. X */
  1506. X{
  1507. X        int  fdesc;              /* file descriptor */
  1508. X
  1509. X        if (!rmworkfile()) return false;
  1510. X        fdesc=creat(workfilename,0);
  1511. X        if (fdesc < 0) {
  1512. X                faterror("Cannot create %s",workfilename);
  1513. X                return false;
  1514. X        } else {
  1515. X                VOID close(fdesc); /* empty file */
  1516. X                return true;
  1517. X        }
  1518. X}
  1519. X
  1520. X
  1521. Xint rmlock(who,delta)
  1522. Xchar * who; struct hshentry * delta;
  1523. X/* Function: removes the lock held by who on delta.
  1524. X * Returns -1 if someone else holds the lock,
  1525. X * 0 if there is no lock on delta,
  1526. X * and 1 if a lock was found and removed.
  1527. X */
  1528. X{       register struct lock * next, * trail;
  1529. X        char * num;
  1530. X        struct lock dummy;
  1531. X        int whomatch, nummatch;
  1532. X
  1533. X        num=delta->num;
  1534. X        dummy.nextlock=next=Locks;
  1535. X        trail = &dummy;
  1536. X        while (next!=nil) {
  1537. X                whomatch=strcmp(who,next->login);
  1538. X                nummatch=strcmp(num,next->delta->num);
  1539. X                if ((whomatch==0) && (nummatch==0)) break;
  1540. X                     /*found a lock on delta by who*/
  1541. X                if ((whomatch!=0)&&(nummatch==0)) {
  1542. X                    error("revision %s locked by %s; use co -r or rcs -u",num,next->login);
  1543. X                    return -1;
  1544. X                }
  1545. X                trail=next;
  1546. X                next=next->nextlock;
  1547. X        }
  1548. X        if (next!=nil) {
  1549. X                /*found one; delete it */
  1550. X                trail->nextlock=next->nextlock;
  1551. X                Locks=dummy.nextlock;
  1552. X                next->delta->lockedby=nil; /* reset locked-by */
  1553. X                return 1; /*success*/
  1554. X        } else  return 0; /*no lock on delta*/
  1555. X}
  1556. X
  1557. X
  1558. X
  1559. X
  1560. X/*****************************************************************
  1561. X * The rest of the routines are for handling joins
  1562. X *****************************************************************/
  1563. X
  1564. Xchar * getrev(sp, tp, buffsize)
  1565. Xregister char * sp, *tp; int buffsize;
  1566. X/* Function: copies a symbolic revision number from sp to tp,
  1567. X * appends a '\0', and returns a pointer to the character following
  1568. X * the revision number; returns nil if the revision number is more than
  1569. X * buffsize characters long.
  1570. X * The revision number is terminated by space, tab, comma, colon,
  1571. X * semicolon, newline, or '\0'.
  1572. X * used for parsing the -j option.
  1573. X */
  1574. X{
  1575. X        register char c;
  1576. X        register int length;
  1577. X
  1578. X        length = 0;
  1579. X        while (((c= *sp)!=' ')&&(c!='\t')&&(c!='\n')&&(c!=':')&&(c!=',')
  1580. X                &&(c!=';')&&(c!='\0')) {
  1581. X                if (length>=buffsize) return false;
  1582. X                *tp++= *sp++;
  1583. X                length++;
  1584. X        }
  1585. X        *tp= '\0';
  1586. X        return sp;
  1587. X}
  1588. X
  1589. X
  1590. X
  1591. Xint preparejoin()
  1592. X/* Function: Parses a join list pointed to by join and places pointers to the
  1593. X * revision numbers into joinlist.
  1594. X */
  1595. X{
  1596. X        struct hshentry * * joindeltas;
  1597. X        struct hshentry * tmpdelta;
  1598. X        register char * j;
  1599. X        char symbolrev[revlength],numrev[revlength];
  1600. X
  1601. X        joindeltas = (struct hshentry * *)talloc(hshsize*sizeof(struct hshentry *));
  1602. X        j=join;
  1603. X        lastjoin= -1;
  1604. X        for (;;) {
  1605. X                while ((*j==' ')||(*j=='\t')||(*j==',')) j++;
  1606. X                if (*j=='\0') break;
  1607. X                if (lastjoin>=joinlength-2) {
  1608. X                        error("too many joins");
  1609. X                        return(false);
  1610. X                }
  1611. X                if(!(j=getrev(j,symbolrev,revlength))) return false;
  1612. X                if (!expandsym(symbolrev,numrev)) return false;
  1613. X                tmpdelta=genrevs(numrev,(char *)nil,(char *)nil,(char *)nil,(struct hshentry * *)joindeltas);
  1614. X                if (tmpdelta==nil)
  1615. X                        return false;
  1616. X                else    joinlist[++lastjoin]=tmpdelta->num;
  1617. X                while ((*j==' ') || (*j=='\t')) j++;
  1618. X                if (*j == ':') {
  1619. X                        j++;
  1620. X                        while((*j==' ') || (*j=='\t')) j++;
  1621. X                        if (*j!='\0') {
  1622. X                                if(!(j=getrev(j,symbolrev,revlength))) return false;
  1623. X                                if (!expandsym(symbolrev,numrev)) return false;
  1624. X                                tmpdelta=genrevs(numrev,(char *)nil,(char *)nil,(char *)nil, (struct hshentry * *) joindeltas);
  1625. X                                if (tmpdelta==nil)
  1626. X                                        return false;
  1627. X                                else    joinlist[++lastjoin]=tmpdelta->num;
  1628. X                        } else {
  1629. X                                error("join pair incomplete");
  1630. X                                return false;
  1631. X                        }
  1632. X                } else {
  1633. X                        if (lastjoin==0) { /* first pair */
  1634. X                                /* common ancestor missing */
  1635. X                                joinlist[1]=joinlist[0];
  1636. X                                lastjoin=1;
  1637. X                                /*derive common ancestor*/
  1638. X                                joinlist[0]=talloc(revlength);
  1639. X                                if (!getancestor(targetdelta->num,joinlist[1],joinlist[0]))
  1640. X                                       return false;
  1641. X                        } else {
  1642. X                                error("join pair incomplete");
  1643. X                                return false;
  1644. X                        }
  1645. X                }
  1646. X        }
  1647. X        if (lastjoin<1) {
  1648. X                error("empty join");
  1649. X                return false;
  1650. X        } else  return true;
  1651. X}
  1652. X
  1653. X
  1654. X
  1655. Xbuildjoin(initialfile)
  1656. Xchar * initialfile;
  1657. X/* Function: merge pairs of elements in joinlist into initialfile
  1658. X * If tostdout==true, copy result to stdout.
  1659. X * All unlinking of initialfile, rev2, and rev3 should be done by cleanup().
  1660. X */
  1661. X{
  1662. X    char commarg[revlength+3];
  1663. X        char subs[revlength];
  1664. X        char * rev2, * rev3;
  1665. X        int i;
  1666. X
  1667. X        rev2=mktempfile("/tmp/",JOINFIL2);
  1668. X        rev3=mktempfile("/tmp/",JOINFIL3);
  1669. X
  1670. X        i=0;
  1671. X        while (i<lastjoin) {
  1672. X                /*prepare marker for merge*/
  1673. X                if (i==0)
  1674. X                        VOID strcpy(subs,targetdelta->num);
  1675. X                else    VOID sprintf(subs, "merge%d",i/2);
  1676. X                diagnose("revision %s",joinlist[i]);
  1677. X                VOID sprintf(commarg,"-p%s",joinlist[i]);
  1678. X                if (run((char*)nil,rev2, co,commarg,"-q",RCSfilename,(char*)nil)) {
  1679. X                        nerror++;return false;
  1680. X                }
  1681. X                diagnose("revision %s",joinlist[i+1]);
  1682. X                VOID sprintf(commarg,"-p%s",joinlist[i+1]);
  1683. X                if (run((char *)nil,rev3, co,commarg,"-q",RCSfilename,(char*)nil)) {
  1684. X                        nerror++; return false;
  1685. X                }
  1686. X                diagnose("merging...");
  1687. X        if (
  1688. X                        (i+2)>=lastjoin && tostdout
  1689. X            ?    run((char*)nil,(char*)nil, merge,"-p",initialfile,rev2,rev3,subs,joinlist[i+1],(char*)nil)
  1690. X            :    run((char*)nil,(char*)nil, merge,     initialfile,rev2,rev3,subs,joinlist[i+1],(char*)nil)) {
  1691. X                        nerror++; return false;
  1692. X                }
  1693. X                i=i+2;
  1694. X        }
  1695. X        return true;
  1696. X}
  1697. X@
  1698. X
  1699. X
  1700. X4.7.2.1
  1701. Xlog
  1702. X@Start of Amiga RCS port branch.
  1703. X@
  1704. Xtext
  1705. X@d31 1
  1706. Xa31 5
  1707. X<<<<<<< co.c
  1708. X"$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/co.c,v 4.7.1.1 89/08/11 01:41:39 rsbx Exp Locker: rsbx $ Purdue CS";
  1709. X=======
  1710. X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 1.2 89/09/17 13:32:18 rick Exp $ Purdue CS";
  1711. X>>>>>>> 1.2
  1712. Xa39 11
  1713. X<<<<<<< co.c
  1714. X * Revision 4.7.1.1  89/08/11  01:41:39  rsbx
  1715. X * Start of cbmvax RCS source branch.
  1716. X=======
  1717. X * Revision 1.2  89/09/17  13:32:18  rick
  1718. X * Port to AmigaDos done by Rick Schaeffer (ricks@@iscuva.iscs.com)
  1719. X * All changes done with conditional compile (#ifdef AMIGA).  This version
  1720. X * compiles correctly with Lattice C version 5.02 or later.
  1721. X>>>>>>> 1.2
  1722. X * 
  1723. X<<<<<<< co.c
  1724. Xa40 3
  1725. X * checked in with -k by rsbx at 89.08.10.16.01.05.
  1726. X * 
  1727. X * Revision 4.7  89/05/01  15:11:41  narten
  1728. Xa49 11
  1729. X=======
  1730. X * Revision 1.4  89/09/16  09:42:00  rick
  1731. X * Modified AMIGA changes to work with Lattice C
  1732. X * 
  1733. X * Revision 1.3  89/09/10  09:26:21  rick
  1734. X * Moved TARGETDIR to rcs:
  1735. X * 
  1736. X * Revision 1.2  88/09/03  15:06:55  rick
  1737. X * Port to AmigaDos.  All done with conditional compiles
  1738. X * 
  1739. X>>>>>>> 1.2
  1740. Xd119 1
  1741. Xa119 5
  1742. X#ifdef AMIGA
  1743. X#include "stat.h"
  1744. X#undef WORKMODE
  1745. X#define WORKMODE(RCSmode) (RCSmode | S_IWRITE)&~((lockflag||!StrictLocks)?S_IWRITE:0)
  1746. X#else
  1747. Xa121 2
  1748. X#endif
  1749. X#include "time.h"
  1750. Xa348 3
  1751. X#ifdef AMIGA
  1752. X                      tostdout?(join!=nil?"t\:":(char *)nil):workfilename,true)))
  1753. X#else
  1754. Xa349 1
  1755. X#endif
  1756. Xa356 4
  1757. X#ifdef AMIGA
  1758. X            fclose(finptr);
  1759. X            unlink(RCSfilename);
  1760. X#endif
  1761. Xa364 3
  1762. X#ifdef AMIGA
  1763. X            if (chmod(RCSfilename,RCSstat.st_attr | S_IWRITE)<0)
  1764. X#else
  1765. Xa365 1
  1766. X#endif
  1767. Xa378 3
  1768. X#ifdef AMIGA
  1769. X            unlink(workfilename);
  1770. X#endif
  1771. Xa387 3
  1772. X#ifdef AMIGA
  1773. X            if (chmod(workfilename, WORKMODE(RCSstat.st_attr))<0)
  1774. X#else
  1775. Xa388 1
  1776. X#endif
  1777. Xd418 1
  1778. Xa418 3
  1779. X#ifdef AMIGA
  1780. X    if (((workstat.st_attr & S_IWRITE) == 0)&&!forceflag) {
  1781. X#else
  1782. Xa419 1
  1783. X#endif
  1784. Xa422 3
  1785. X#ifdef AMIGA
  1786. X        fflush(stderr);
  1787. X#endif
  1788. Xa607 4
  1789. X#ifdef AMIGA
  1790. X        rev2=mktempfile("t:",JOINFIL2);
  1791. X        rev3=mktempfile("t:",JOINFIL3);
  1792. X#else
  1793. Xa609 1
  1794. X#endif
  1795. Xa617 1
  1796. X<<<<<<< co.c
  1797. Xa619 4
  1798. X=======
  1799. X                VOID sprintf(command,"%sco -p%s -q  %s >%s\n",TARGETDIR,joinlist[i],RCSfilename,rev2);
  1800. X                if (system(command)) {
  1801. X>>>>>>> 1.2
  1802. Xa622 1
  1803. X<<<<<<< co.c
  1804. Xa624 4
  1805. X=======
  1806. X                VOID sprintf(command,"%sco -p%s -q  %s >%s\n",TARGETDIR,joinlist[i+1],RCSfilename,rev3);
  1807. X                if (system(command)) {
  1808. X>>>>>>> 1.2
  1809. X@
  1810. X
  1811. X
  1812. X4.7.2.2
  1813. Xlog
  1814. X@Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
  1815. Xsources I have here (and are later than the ones Rick used).
  1816. X@
  1817. Xtext
  1818. X@d31 5
  1819. Xa35 1
  1820. X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.1 89/10/13 19:17:21 rsbx Exp Locker: rsbx $ Purdue CS";
  1821. Xd44 1
  1822. Xa44 3
  1823. X * Revision 4.7.2.1  89/10/13  19:17:21  rsbx
  1824. X * Start of Amiga RCS port branch.
  1825. X * 
  1826. Xd47 6
  1827. Xd54 1
  1828. Xd68 11
  1829. Xd683 1
  1830. Xd686 4
  1831. Xd693 1
  1832. Xd696 4
  1833. X@
  1834. X
  1835. X
  1836. X4.7.2.3
  1837. Xlog
  1838. X@NULL finptr after closing it.
  1839. X@
  1840. Xtext
  1841. X@d31 1
  1842. Xa31 1
  1843. X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.2 89/10/15 15:43:07 rsbx Exp $ Purdue CS";
  1844. Xa39 4
  1845. X * Revision 4.7.2.2  89/10/15  15:43:07  rsbx
  1846. X * Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
  1847. X * sources I have here (and are later than the ones Rick used).
  1848. X * 
  1849. Xd377 1
  1850. Xa377 1
  1851. X            fclose(finptr); finptr = NULL;
  1852. X@
  1853. X
  1854. X
  1855. X4.7.2.4
  1856. Xlog
  1857. X@Changes to make the delete bit to track the write bit. Made protection
  1858. Xbit manipulation less insane.
  1859. X@
  1860. Xtext
  1861. X@d31 1
  1862. Xa31 1
  1863. X"$Header: /u/softeng/rsbx/rcs/amiga/RCS/co.c,v 4.7.2.3 89/10/30 13:37:50 rsbx Exp $ Purdue CS";
  1864. Xa39 3
  1865. X * Revision 4.7.2.3  89/10/30  13:37:50  rsbx
  1866. X * NULL finptr after closing it.
  1867. X * 
  1868. Xd134 2
  1869. Xd382 1
  1870. Xa382 5
  1871. X            if (chmod(RCSfilename, RCSstat.st_attr|S_IDELETE)<0)
  1872. X                warn("Can't adjust mode of %s",RCSfilename);
  1873. X                if (unlink(RCSfilename) != 0) {            /* Remove failed   */
  1874. X                    error("Can't unlink %s",RCSfilename);
  1875. X                    }
  1876. Xd393 1
  1877. Xa393 1
  1878. X            if (chmod(RCSfilename,RCSstat.st_attr & ~(S_IWRITE|S_IDELETE))<0)
  1879. Xa410 1
  1880. X            chmod(workfilename, workstat.st_attr|S_IDELETE);
  1881. Xd423 1
  1882. Xa423 1
  1883. X        if (chmod(workfilename, WORKMODE(RCSstat.st_attr))<0)
  1884. Xd425 1
  1885. Xa425 1
  1886. X         if (chmod(workfilename, WORKMODE(RCSstat.st_mode))<0)
  1887. Xd427 1
  1888. Xa427 1
  1889. X            warn("Can't adjust mode of %s",workfilename);
  1890. Xd457 1
  1891. Xa457 1
  1892. X    if ((workstat.st_attr & S_IWRITE)&&!forceflag) {
  1893. Xa478 4
  1894. X#ifdef AMIGA
  1895. X    if (chmod(workfilename, workstat.st_attr|S_IDELETE)<0)
  1896. X            warn("Can't adjust mode of %s",workfilename);
  1897. X#endif
  1898. X@
  1899. X
  1900. X
  1901. X4.7.1.1
  1902. Xlog
  1903. X@Start of cbmvax RCS source branch.
  1904. X@
  1905. Xtext
  1906. X@d31 1
  1907. Xa31 1
  1908. X"$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/co.c,v 4.7 89/05/01 15:11:41 narten Exp $ Purdue CS";
  1909. Xa39 3
  1910. X * Revision 4.7  89/05/01  15:11:41  narten
  1911. X * checked in with -k by rsbx at 89.08.10.16.01.05.
  1912. X * 
  1913. X@
  1914. SHAR_EOF
  1915. echo "extracting rcs/rcs.rcsfiles/curdir.c,v"
  1916. sed 's/^X//' << \SHAR_EOF > rcs/rcs.rcsfiles/curdir.c,v
  1917. Xhead     3.3;
  1918. Xbranch   3.3.2;
  1919. Xaccess   ;
  1920. Xsymbols  amiga_rcs:3.3.2 cbmvax_source:3.3.1 uunet_june89_dist:3.3;
  1921. Xlocks    ; strict;
  1922. Xcomment  @ * @;
  1923. X
  1924. X
  1925. X3.3
  1926. Xdate     89.05.01.15.11.49;  author narten;  state Exp;
  1927. Xbranches 3.3.1.1 3.3.2.1;
  1928. Xnext     ;
  1929. X
  1930. X3.3.1.1
  1931. Xdate     89.08.11.01.41.44;  author rsbx;  state Exp;
  1932. Xbranches ;
  1933. Xnext     ;
  1934. X
  1935. X3.3.2.1
  1936. Xdate     89.10.13.19.17.29;  author rsbx;  state Exp;
  1937. Xbranches ;
  1938. Xnext     3.3.2.2;
  1939. X
  1940. X3.3.2.2
  1941. Xdate     89.10.15.15.43.16;  author rsbx;  state Exp;
  1942. Xbranches ;
  1943. Xnext     ;
  1944. X
  1945. X
  1946. Xdesc
  1947. X@get current directory.
  1948. X@
  1949. X
  1950. X
  1951. X
  1952. X3.3
  1953. Xlog
  1954. X@checked in with -k by rsbx at 89.08.10.16.01.39.
  1955. X@
  1956. Xtext
  1957. X@/* Copyright (C) 1982, 1988, 1989 Walter Tichy
  1958. X * All rights reserved.
  1959. X *
  1960. X * Redistribution and use in source and binary forms are permitted
  1961. X * provided that the above copyright notice and this paragraph are
  1962. X * duplicated in all such forms and that any documentation,
  1963. X * advertising materials, and other materials related to such
  1964. X * distribution and use acknowledge that the software was developed
  1965. X * by Walter Tichy.
  1966. X * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  1967. X * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  1968. X * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  1969. X *
  1970. X * Report all problems and direct all questions to:
  1971. X *   rcs-bugs@@cs.purdue.edu
  1972. X * 
  1973. X
  1974. X
  1975. X
  1976. X
  1977. X
  1978. X
  1979. X
  1980. X*/
  1981. X
  1982. X/*******************************************************************
  1983. X *                     curdir: get current directory
  1984. X *******************************************************************
  1985. X * returns full pathname of working (current) directory.
  1986. X * This is an adaptation of pwd, and works for grafted directories.
  1987. X * Unlike pwd, returns to current directory after it is finished.
  1988. X * Uses stdio buffering for directory reads.
  1989. X */
  1990. X
  1991. X static char rcsid[]=
  1992. X "$Header: /usr/src/local/bin/rcs/src/RCS/curdir.c,v 3.3 89/05/01 15:11:49 narten Exp $";
  1993. X
  1994. X/*******************************************************************
  1995. X *      $Log:    curdir.c,v $
  1996. X * Revision 3.3  89/05/01  15:11:49  narten
  1997. X * changed copyright header to reflect current distribution rules
  1998. X * 
  1999. X * Revision 3.2  87/10/18  10:21:49  narten
  2000. X * Updating version numbers. Changes relative to 1.1 are actually 
  2001. X * relative to 3.2
  2002. X * 
  2003. X * Revision 1.1  84/01/23  14:50:01  kcs
  2004. X * Initial revision
  2005. X * 
  2006. X * Revision 3.2  82/12/24  15:41:51  wft
  2007. X * Changed curdir() such that it returns a pointer to the pathname of
  2008. X * the current working directory, just as Berkeley's getcwd().
  2009. X * 
  2010. X * Revision 3.1  82/10/18  21:16:21  wft
  2011. X * curdir() now uses stdio buffering for directory reads,
  2012. X * returns to working directory after done, and closes the directories.
  2013. X * A testprogram was also added.
  2014. X * 
  2015. X *******************************************************************/
  2016. X
  2017. X#include        "rcsbase.h"
  2018. X#include        <sys/param.h>
  2019. X#include        <sys/stat.h>
  2020. X#include        <sys/dir.h>
  2021. X#define dot     "."
  2022. X#define dotdot  ".."
  2023. X
  2024. X
  2025. Xstatic char cwd[NCPPN];
  2026. X
  2027. Xchar * curdir()
  2028. X/* Function: places the pathname of the current directory into cwd
  2029. X * and returns a pointer to it. Returns NULL on failure.
  2030. X */
  2031. X{
  2032. X        FILE    *file;
  2033. X        struct  stat    d, dd;
  2034. X        struct  direct  dir;
  2035. X
  2036. X        int rdev, rino;
  2037. X        int off;
  2038. X        register i,j;
  2039. X
  2040. X        cwd[off= 0] = '/';
  2041. X        cwd[1] = '\0';
  2042. X        stat("/", &d);
  2043. X        rdev = d.st_dev;
  2044. X        rino = d.st_ino;
  2045. X        for (;;) {
  2046. X                if (stat(dot, &d)<0) return NULL;
  2047. X                if (d.st_ino==rino && d.st_dev==rdev) {
  2048. X                        if (cwd[off] == '/') cwd[off] = '\0';
  2049. X                        chdir(cwd); /*change back to current directory*/
  2050. X                        return cwd;
  2051. X                }
  2052. X                if ((file = fopen(dotdot,"r")) == NULL) return NULL;
  2053. X                if (fstat(fileno(file), &dd)<0) goto fail;
  2054. X                chdir(dotdot);
  2055. X                if(d.st_dev == dd.st_dev) {
  2056. X                        if(d.st_ino == dd.st_ino) {
  2057. X                            if (cwd[off] == '/') cwd[off] = '\0';
  2058. X                            chdir(cwd); /*change back to current directory*/
  2059. X                            fclose(file);
  2060. X                            return cwd;
  2061. X                        }
  2062. X                        do {
  2063. X                            if (fread((char *)&dir, sizeof(dir), 1, file) !=1)
  2064. X                                goto fail;
  2065. X                        } while (dir.d_ino != d.st_ino);
  2066. X                }
  2067. X                else do {
  2068. X                        if(fread((char *)&dir, sizeof(dir), 1, file) != 1) {
  2069. X                            goto fail;
  2070. X                        }
  2071. X                        stat(dir.d_name, &dd);
  2072. X                } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
  2073. X                fclose(file);
  2074. X
  2075. X                /* concatenate file name */
  2076. X                i = -1;
  2077. X                while (dir.d_name[++i] != 0);
  2078. X                for(j=off+1; j>0; --j)
  2079. X                        cwd[j+i+1] = cwd[j];
  2080. X                off=i+off+1;
  2081. X                cwd[i+1] = '/';
  2082. X                for(--i; i>=0; --i)
  2083. X                        cwd[i+1] = dir.d_name[i];
  2084. X        } /* end for */
  2085. X
  2086. Xfail:   fclose(file);
  2087. X        return NULL;
  2088. X}
  2089. X
  2090. X
  2091. X#ifdef TEST
  2092. Xmain ()
  2093. X{
  2094. X        printf ("pwd = %s\n", curdir());
  2095. X}
  2096. X#endif TEST
  2097. X
  2098. X@
  2099. X
  2100. X
  2101. X3.3.2.1
  2102. Xlog
  2103. X@Start of Amiga RCS port branch.
  2104. X@
  2105. Xtext
  2106. X@d36 1
  2107. Xa36 5
  2108. X<<<<<<< curdir.c
  2109. X "$Header: /u/softeng/rsbx/rcs/amiga/RCS.cbmvax/curdir.c,v 3.3.1.1 89/08/11 01:41:44 rsbx Exp Locker: rsbx $";
  2110. X=======
  2111. X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/curdir.c,v 1.2 89/09/17 13:40:50 rick Exp $";
  2112. X>>>>>>> 1.2
  2113. Xa39 4
  2114. X<<<<<<< curdir.c
  2115. X * Revision 3.3.1.1  89/08/11  01:41:44  rsbx
  2116. X * Start of cbmvax RCS source branch.
  2117. X * 
  2118. Xa40 3
  2119. X * checked in with -k by rsbx at 89.08.10.16.01.39.
  2120. X * 
  2121. X * Revision 3.3  89/05/01  15:11:49  narten
  2122. Xa41 9
  2123. X=======
  2124. X * Revision 1.2  89/09/17  13:40:50  rick
  2125. X * Port to AmigaDos done by Rick Schaeffer (ricks@@iscuva.iscs.com)
  2126. X * All changes done with condition compile (#ifdef AMIGA).  This
  2127. X * version compiles correctly with Lattice C version 5.02 or later.
  2128. X * 
  2129. X * Revision 1.1  89/09/17  13:04:17  rick
  2130. X * Initial revision
  2131. X>>>>>>> 1.2
  2132. X@
  2133. X
  2134. X
  2135. X3.3.2.2
  2136. Xlog
  2137. X@Finished the integration of Rick Schaeffer's RCS Amiga port with the RCS
  2138. Xsources I have here (and are later than the ones Rick used).
  2139. X@
  2140. Xtext
  2141. X@d36 5
  2142. Xa40 1
  2143. X "$Header: /u/softeng/rsbx/rcs/amiga/RCS/curdir.c,v 3.3.2.1 89/10/13 19:17:29 rsbx Exp Locker: rsbx $";
  2144. Xd44 1
  2145. Xa44 3
  2146. X * Revision 3.3.2.1  89/10/13  19:17:29  rsbx
  2147. X * Start of Amiga RCS port branch.
  2148. X * 
  2149. Xd53 9
  2150. X@
  2151. X
  2152. X
  2153. X3.3.1.1
  2154. Xlog
  2155. X@Start of cbmvax RCS source branch.
  2156. X@
  2157. Xtext
  2158. X@d36 1
  2159. Xa36 1
  2160. X "$Header: /u/softeng/rsbx/rcs/rcs.uunet/src/RCS/curdir.c,v 3.3 89/05/01 15:11:49 narten Exp $";
  2161. Xa39 3
  2162. X * Revision 3.3  89/05/01  15:11:49  narten
  2163. X * checked in with -k by rsbx at 89.08.10.16.01.39.
  2164. X * 
  2165. X@
  2166. SHAR_EOF
  2167. echo "End of archive 13 (of 14)"
  2168. # if you want to concatenate archives, remove anything after this line
  2169. exit
  2170.